ПОЯСНЕНИЯ К АЛГОРИТМУ Таблица размещается в памяти следующим образом. Поле pRow структуры tb_table является указателем на динамический массив указателей. Каждый элемент этого массива является указателем на строку таблицы. Каждая строка таблицы тоже является динамическим массивом, состоящим из ячеек (tb_cell). Строки хранятся хаотично в памяти, и единственное, что их связывает, - это динамический массив указателей. Такой способ хранения таблицы обеспечивает высокую скорость доступа к элементам (как в обычном двумерном массиве), а также экономное использование памяти без размешения больших непрерывных блоков. Использование динамического массива указателей вместо обычного двумерного массива также дает выигрыш при вставке и удалении строк в произвольные места таблицы, а также при сортировке (приходится перемещать только элементы массива указателей, а не целиком строки таблицы). Описатели столбцов хранятся в динамическом массиве, адрес которого хранится в поле pCol структуры tb_table. Поля iRowNum и iColNum предназначены для храниения текушего количества строк и столбцов соответственно. Вставка строки происходит так: 1. Длина динамического массива указателей увеличивается на один элемент. 2. Все элементы массива, начиная с N-го (место, куда нужно вставить строку), сдвигаются вниз на один элемент. 3. Под строку выделяется память, и адрес сохраняется в освободившейся (N-ой) ячейке массива указателей. 4. iRowNum увеличивается на 1. Добавление строки в конец происходит так: 1. Длина динамического массива указателей увеличивается на один элемент. 2. Под строку выделяется память, и адрес сохраняется в последней ячейке массива указателей. 3. iRowNum увеличивается на 1. Выделение памяти под строку происходит так: 1. Выделяется память под массив, состоящий из M ячеек (M - количество столбцов в таблице). 2. По очереди проверяются типы всех столбцов, и, если тип оказался равным tb_type_char (символьный), то дополнительно выделяется нужное количество байт для хранения символьной переменной, а адрес сохраняется в соответствующей ячейке строки. Удаление строки происходит так: 1. Освобождается память, занимаемая N-ой (удаляемой) строкой. Если какие-то из ее ячеек были ссылками на симольные переменные, то память, занимаемая этими переменными, тоже освобождается. 2. Все элементы массива указателей, начиная с (N+1)-го, сдвигаются вверх на один элемент. 3. Длина массива указателей уменьшается на один элемент. 4. iRowNum уменьшается на 1. Удаление всех строк таблицы происходит так: 1. Последовательно освобождается память, занимаемая каждой строкой таблицы (как это описано выше в п.1). 2. Освобождается память, занимаемая массивом указателей. 3. iRowNum и pRow устанавливаются в 0. При удалении всей таблицы сначала удаляются все строки, а затем освобождается память, занимаемая массивом описателей столбцов. При этом iColNum и pCol тоже устанавливаются в 0. Сортировка таблицы осуществляется как обычная сортировка одномерного массива с той разницей, что сравниваются между собой строки таблицы, а меняются местами элементы массива указателей. Сравнение строк происходит так: выполняется последовательное сравнение всех нужных ячеек (указанных в массиве с индексами столбцов) до тех пор, пока результат сравнения не окажется отличным от нуля, либо пока не закончится массив с индексами столбцов. Результат стравнения строк - результат последнего сравнения перед выходом из этого цикла.